/**
 * Created by xiaox on 2017/7/4.
 */

var LngLat = require('../model/Lnglat');
var Tile = require('../model/Tile');


var CoordinateUtil = function(){

    this.tileToLnglat = function(x,y,z){

        var tile = new Tile(x,y,z);

        var n = Math.pow(2, tile.getZ());
        var lng = tile.getX() / n * 360.0 - 180.0;
        var lat = Math.atan(Math.sinh(Math.PI * (1 - 2 * tile.getY() / n)));
        lat = lat * 180.0 / Math.PI;

        return new LngLat(lng, lat);

    };

    this.lnglatToTile = function(zoom,lng,lat){

        var lnglat = new LngLat(lng,lat);

        var n = Math.pow(2, zoom);

        var tileX = ((lnglat.getLng() + 180) / 360) * n;

        /**
         *
         弧度= 角度 * Math.PI / 180;
         角度 = 弧度 * 180 / Math.PI;

         //Math.toRadians(lnglat.getLat()

         double n = Math.pow(2, zoom);
         double tileX = ((lnglat.getLng() + 180) / 360) * n;

         double tileY = (1 - (Math.log(Math.tan(Math.toRadians(lnglat.getLat())) + (1 / Math.cos(Math.toRadians(lnglat.getLat())))) / Math.PI)) / 2 * n;
         return new Tile(new Double(tileX).intValue(), new Double(tileY).intValue(), zoom);

         **/

            //var tileY = (1 - (Math.log((lnglat.getLat()*Math.PI/180.0) + (1 / Math.cos(lnglat.lat))) / Math.PI)) / 2 * n;
        var tileY = (1 - (Math.log(Math.tan(lnglat.getLat()*Math.PI/180.0) + (1 / Math.cos(lnglat.getLat()*Math.PI/180.0))) / Math.PI)) / 2 * n;

        return new Tile(tileX, tileY, zoom);

    }

}

module.exports = CoordinateUtil;